\documentclass[UTF8]{ctexart}
\input{../latexstyle/manual.sty}

\graphicspath{ {./images/} }

\title{Manipula数据类型手册}

\begin{document}
\maketitle
\section{confdata}

\subsection*{说明}
描述机器人的构型。机械臂求逆时存在多解，即机械臂末端达到相同的位姿，机械臂具有不
同的构型，为了表示各轴可能的构型之一，通过使用四个quadrant变量来指定机械臂的构
型。

对于六轴机械臂，使用轴1，4，6的象限编号和一个机械臂配置量来表示机械臂的构型。每
个旋转轴根据转角大小，使用0，1，2，3等数字表示其象限编号。编号0表示0°到90°，编号
1表示90°到180°，编号2表示180°到270°，编号3表示270°到360°，编号-1表示0°到-90°，编
号-2表示-90°到-180°，编号-3表示-180°到-270°，编号-4表示-270°到-360°。

\subsection*{数据项}

\subsubsection*{cf1}
类型：quadrant

用于表示轴1的象限编号。

\subsubsection*{cf4}
类型：quadrant

用于表示轴4的象限编号。

\subsubsection*{cf6}
类型：quadrant

用于表示轴6的象限编号。

\subsubsection*{cfx}
类型：quadrant

用于从编号0到7的八种可能的机械臂配置种选择一种。
\begin{table}[htbp]
\centering
\begin{tabular}{| l | c | c | c |}
	\hline
	cfx & 腕中心相对于1轴的位置 & 腕中心相对于3轴的位置 & 5轴的角度\\
	\hline
	0 & 在前面 & 在前面 & 正\\
	\hline
	1 & 在前面 & 在前面 & 负\\
	\hline
	2 & 在前面 & 在后面 & 正\\
	\hline
	3 & 在前面 & 在后面 & 负\\
	\hline
	4 & 在后面 & 在前面 & 正\\
	\hline
	5 & 在后面 & 在前面 & 负\\
	\hline
	6 & 在后面 & 在后面 & 正\\
	\hline
	7 & 在后面 & 在后面 & 负\\
	\hline
\end{tabular}
\end{table}

\begin{figure}[htbp]
	\centering
	\subfigure[在1轴的前面]{
	  \includegraphics[width=0.3\textwidth]{J1_front.png}
	}
	\subfigure[在1轴的后面]{
	  \includegraphics[width=0.3\textwidth]{J1_back.png}
	}
	\subfigure[奇点]{
	  \includegraphics[width=0.3\textwidth]{Singularity_shoulder.png}
	}
	\caption{腕中心相对于1轴的位置}

\end{figure}

\begin{figure}[htbp]
	\centering
	\subfigure[在3轴的前面]{
	  \includegraphics[width=0.3\textwidth]{J3_front.png}
	}
	\subfigure[在3轴的后面]{
	  \includegraphics[width=0.3\textwidth]{J3_back.png}
	}
	\subfigure[奇点]{
	  \includegraphics[width=0.3\textwidth]{Singularity_elbow.png}
	}
	\caption{腕中心相对于3轴的位置}

\end{figure}

\begin{figure}[htbp]
	\centering
	\subfigure[正]{
	  \includegraphics[width=0.3\textwidth]{J5_positive.png}
	}
	\subfigure[负]{
	  \includegraphics[width=0.3\textwidth]{J5_Negative.png}
	}
	\subfigure[奇点]{
	  \includegraphics[width=0.3\textwidth]{Singularity_wrist.png}
	}
	\caption{5轴的角度}

\end{figure}


\section{extjoint}

\subsection*{说明}
描述外部轴，机械臂除了能控制六个内部轴外，最多还能控制六个外部轴。在控制程序内，
这六个外部轴称为逻辑轴，可以使用a,b,c,d,e,f表示，每个逻辑轴都可以和一个外部轴连
接。

对每个连接至外部轴的逻辑轴，如果是旋转轴，其位置使用相对于标定位置的角度表示，如
果是线性轴，其位置使用相对于标定位置的距离表示。如果逻辑轴没有连接到外部轴，则该
轴的位置默认设置为9E9，表示该轴未激活。也可以将某个连接至外部轴的逻辑轴设置为
9E9。如果轴未激活，则不会进行任何运动，也不会检测该轴。
\subsection*{数据项}

\subsubsection*{eax\_a}
类型：num

用于表示逻辑轴“a”的位置，单位为mm或°。

\subsubsection*{eax\_b}
类型：num

用于表示逻辑轴“b”的位置，单位为mm或°。

\subsubsection*{eax\_c}
类型：num

用于表示逻辑轴“c”的位置，单位为mm或°。

\subsubsection*{eax\_d}
类型：num

用于表示逻辑轴“d”的位置，单位为mm或°。

\subsubsection*{eax\_e}
类型：num

用于表示逻辑轴“e”的位置，单位为mm或°。

\subsubsection*{eax\_f}
类型：num

用于表示逻辑轴“f”的位置，单位为mm或°。

\section{loaddata}

\subsection*{说明}
描述负载数据。包括质量，质心位置，力矩和惯性矩等信息。负载数据也是工具数据的一部
分。负载数据用于机械臂动力学建模，以便以最佳方式控制机器人运动。


\subsection*{数据项}

\subsubsection*{mass}
类型：num

用于表示质量信息，单位为kg

\subsubsection*{cog}
类型：pos

用于表示质心在工具坐标系下的坐标。

\subsubsection*{aom}
类型：orient

用于表示力矩在工具坐标系下的方向。

\subsubsection*{ix}
类型：num

用于表示关于x轴的惯性矩。单位为$kgm^2$。

\subsubsection*{iy}
类型：num

用于表示关于y轴的惯性矩。单位为$kgm^2$。

\subsubsection*{iz}
类型：num
 
用于表示关于z轴的惯性矩。单位为$kgm^2$。

\section{orient}

\subsection*{说明}
用于描述方向和旋转。该四元数包含实部w和虚部x，y，z。

\subsection*{数据项}

\subsubsection*{w}
类型：num

用于表示四元数的实部。

\subsubsection*{x}
类型：num

用于表示四元素虚部第一项。

\subsubsection*{y}
类型：num

用于表示四元素虚部第二项。

\subsubsection*{z}
类型：num

用于表示四元素虚部第三项。

\section{pos}

\subsection*{说明}
描述位置坐标（x, y, z)。

\subsection*{数据项}

\subsubsection*{x}
类型：num

表示位置的x坐标。

\subsubsection*{y}
类型：num

表示位置的y坐标。

\subsubsection*{z}
类型：num

表示位置的z坐标。


\section{pose}

\subsection*{说明}
表示坐标系位姿，用于描述一个坐标系相对于另一个坐标系的位移和旋转。

\subsection*{数据项}

\subsubsection*{trans}
类型：pos

用于表示坐标系的位置。

\subsubsection*{rot}
类型：orient

用于表示坐标系的方向。

\section{quadrant}

\subsection*{说明}

枚举类型。允许值为：

\begin{verbatim}
n8,
n7,
n6,
n5,
n4,
n3,
n2,
n1,
p0,
p1,
p2,
p3,
p4,
p5,
p6,
p7,
invalid
\end{verbatim}

p表示正，n表示负。invalid表示无效值。每个枚举值代表一个象限，90度的范围。

\section{robjoint}

\subsection*{说明}
描述机械臂各关节的位置。

各关节的位置定义为各关节从标定位置旋转的角度。旋转方向符合右手定则。

\subsection*{数据项}

\subsubsection*{rax\_1}
类型：num

用于表示轴1相对于标定位置旋转的角度。

\subsubsection*{rax\_2}
类型：num

用于表示轴2相对于标定位置旋转的角度。

\subsubsection*{rax\_3}
类型：num

用于表示轴3相对于标定位置旋转的角度。

\subsubsection*{rax\_4}
类型：num

用于表示轴4相对于标定位置旋转的角度。

\subsubsection*{rax\_5}
类型：num

用于表示轴5相对于标定位置旋转的角度。

\subsubsection*{rax\_6}
类型：num

用于表示轴6相对于标定位置旋转的角度。

\section{jointtarget}

\subsection*{说明}
描述机械臂内部轴和外部轴的位置。是执行MoveAbsJ指令时机械臂内部轴和外部轴需
要移动到的位置。

\subsection*{数据项}

\subsubsection*{robax}
类型：robjoint

用于表示机机械臂内部轴的位置，该位置为相对于标定位置的旋转角度。

\subsubsection*{extax}
类型：extjoint

用于表示外部轴的位置。对于旋转轴，该位置为相对于标定位置的旋转角度。对于线性轴，
该位置为相对于标定位置的距离。

\section{robtarget}

\subsection*{说明}
描述表示机械臂和外部轴的目标位姿。包括目标点的位置、方向和机械臂到达目标点的构
型。
\subsection*{数据项}

\subsubsection*{trans}
类型：pos

用于表示TCP相对于工件坐标系的x, y, z坐标值，单位为mm。如果没有定义工件坐标系，则
该位置是相对于机器人任务坐标系的。

\subsubsection*{rot}
类型：orient

用于表示Tool相对于工件坐标系的方向，使用四元数表示法。如果没有定义工件坐标系，则
该方向是相对于机器人任务坐标系的。

\subsubsection*{robconf}
类型：confdata

用于表示机械臂的构型。详见数据confdata。

\subsubsection*{extax}
类型：extjoint

用于表示外部轴的位置。对于旋转轴，该位置为相对于标定位置旋转的角度。对于线性轴，
该位置为相对于标定位置的距离。详见数据extjoint。

\section{speeddata}

\subsection*{说明}
用于描述机械臂和外轴均开始移动时的速率。

速度数据包含TCP的移动速度、重定向的速度和外轴速度。不同速度类型之间会相互影响，
以便所有运动同时停止。速度还会受到机械臂性能和运动路径的影响。

\subsection*{数据项}

\subsubsection*{v\_tcp}
类型：num

用于表示TCP的速度，单位为mm/s 。

\subsubsection*{v\_ori}
类型：num

用于表示TCP转向的速度，单位为degrees/s 。

\subsubsection*{v\_leax}
类型：num

用于表示外部线性轴的速度，单位为mm/s 。

\subsubsection*{v\_reax}
类型：num

用于表示外部旋转轴的速度，单位为degrees/s 。

\begin{table}[htbp]
	\centering
	\begin{tabular}{| l | l | l | l | l |}
		\hline
		Name & v\_tcp(mm/s) & v\_ori(°/s) & v\_leax(mm/s) & v\_reax(°/s) \\
		\hline
		v5 & 5 & 500 & 5000 & 1000\\
		\hline
		v10 & 10 & 500 & 5000 & 1000\\
		\hline
		v20 & 20 & 500 & 5000 & 1000\\
		\hline
		v30 & 30 & 500 & 5000 & 1000\\
		\hline
		v40 & 40 & 500 & 5000 & 1000\\
		\hline
		v50 & 50 & 500 & 5000 & 1000\\
		\hline
		v60 & 60 & 500 & 5000 & 1000\\
		\hline
		v80 & 80 & 500 & 5000 & 1000\\
		\hline
		v100 & 100 & 500 & 5000 & 1000\\
		\hline
		v150 & 150 & 500 & 5000 & 1000\\
		\hline
		v200 & 200 & 500 & 5000 & 1000\\
		\hline
		v300 & 300 & 500 & 5000 & 1000\\
		\hline
		v400 & 400 & 500 & 5000 & 1000\\
		\hline
		v500 & 500 & 500 & 5000 & 1000\\
		\hline
		v600 & 600 & 500 & 5000 & 1000\\
		\hline
		v800 & 800 & 500 & 5000 & 1000\\
		\hline
		v1000 & 1000 & 500 & 5000 & 1000\\
		\hline
		v1500 & 1500 & 500 & 5000 & 1000\\
		\hline
		v2000 & 2000 & 500 & 5000 & 1000\\
		\hline
		v3000 & 3000 & 500 & 5000 & 1000\\
		\hline
		v4000 & 4000 & 500 & 5000 & 1000\\
		\hline
		v5000 & 5000 & 500 & 5000 & 1000\\
		\hline
		v6000 & 6000 & 500 & 5000 & 1000\\
		\hline
		v7000 & 7000 & 500 & 5000 & 1000\\
		\hline
	\end{tabular}
\end{table}

\section{tooldata}

\subsection*{说明}
描述工具信息，包括工具中心点（TCP）的位姿和工具负载情况。

如果使用了固定工具，则工具数据首先定义该工具的位姿，然后描述机械臂移动夹具的负
载。

工具中心点(TCP)表示工具上的点，该点在机械臂运动时能够满足编程路径和速度。

\subsection*{数据项}

\subsubsection*{robhold}
类型：bool

描述工具是否由机器人持有。

\begin{itemize}
	\item true: 工具由机器人持有，TCP坐标相对于机器人腕关节坐标系计算。
	\item false: 工具固定，TCP坐标相对于任务坐标系计算。
\end{itemize}

\subsubsection*{tframe}
类型：pose

用于表示工具坐标系和TCP点相对于机械臂腕关节坐标系(tool0)的位置和位姿。

如果定义的是固定工具，即robhold为false, 则tframe的定义相对于机器人任务坐标系。

\subsubsection*{tload}
类型：loaddata

用于表示负载信息。包括质量，质心位置，力矩和惯性矩等信息。详见数据loaddata。

\section{wobjdata}

\subsection*{说明}
WorkObject data, 描述工件数据，用于计算工件坐标系。工件坐标系由3个坐标系复合而成：

\begin{enumerate}
    \item wobjdata所属的机器人任务坐标系
    \item 用户坐标系uframe，有2种可能：一种是由本数据所定义，另一种是由其他机械单元所
          定义。并且，本数据所定义的uframe的参照坐标系有2种，依赖于robhold.
    \item 物体坐标系oframe
\end{enumerate}

工件坐标系的计算过程如下：
\begin{lstlisting}
    if ufprog == true
        if robhold == false
            使用uframe字段相对于任务坐标系计算用户坐标系
        else
            使用uframe字段相对于机器人手腕计算用户坐标系
    else
        根据ufmec获取用户坐标系

    使用oframe相对于用户坐标系计算工件坐标系
\end{lstlisting}


\subsection*{数据项}

\subsubsection*{robhold}
类型：bool

用于定义工件是否由机器人持有。robhold为false时，uframe相对于任务坐标系定义。robhold为true时， uframe
相对于机器人手腕坐标系定义。

当配合使用的tooldata的robhold为false的时候，需要将wobjdata的robhold字段设置为true.

如果ufprog字段为false, 则robhold字段被忽略。

\subsubsection*{ufprog}
类型：bool

用于定义工件安装形式。

若为true, 表示工件是固定的，或者由本机器人持有，用户坐标系由uframe数据项定义。

若为false, 表示工件安装在移动装置上，工件的用户坐标系的数据来自于数据项ufmec所指定的机械单元。ufmec
指定的机械装置需要由本机器人的控制器控制，作为外轴，或者是本控制器控制的另一个机械臂。uframe字段会
被忽略。

\subsubsection*{ufmec}
类型：string

定义工装移动所使用的机械单元名称。仅当ufprog为false时本数据项有效。

\subsubsection*{uframe}
类型：pose

定义用户坐标系。仅当ufprog为true时，本数据项有效。

如果robhold为false, 则用户坐标系的定义相对于机器人的任务坐标系。如果robhold为
true, 则用户坐标系的定义相对于机器人的手腕坐标系，即tool0.

\subsubsection*{oframe}
类型：pose

定义物体坐标系。物体坐标系相对于用户坐标系定义。

\subsection*{例子}

tooldata和wobjdata需要配合来定义。有以下3种常见的配合情况。

\subsubsection*{工具装在机械臂上，工件固定}

这是最常见的情况。数据的各个组件如下定义。

tooldata.robhold: true

tooldata.tframe: 相对于tool0定义

wobjdata.robhold: false

wobjdata.ufprog: true

wobjdata.ufmec: 无须定义

wobjdata.uframe: 相对于task frame定义

wobjdata.oframe: 相对于uframe定义的

运动公式：uframe * oframe * robtarget = robot base frame * tool0 * tframe

\subsubsection*{工具固定，工件在运行程序的机械臂上}

数据的各个组件如下定义。

tooldata.robhold: false

tooldata.tframe: 相对于task frame定义

wobjdata.robhold: true

wobjdata.ufprog: true

wobjdata.ufmec: 无须定义

wobjdata.uframe: 相对于tool0定义

wobjdata.oframe: 相对于uframe定义

运动公式：robot base frame * tool0 * oframe * robtarget = tframe

\subsubsection*{工具装在机械臂上，工件由外轴控制运动}
数据的各个组件如下定义。

tooldata.robhold: true

tooldata.tframe: 相对于wrist定义

wobjdata.robhold: false

wobjdata.ufprog: false

wobjdata.ufmec: 持有工件的外轴机械装置

wobjdata.uframe: 无须定义

wobjdata.oframe: 相对于用户坐标系定义

运动公式：ufmec's frame * oframe * robtarget = robot base frame * tool0 * tframe

\section{zonedata}

\subsection*{说明}

描述机械臂在一个编程位置的转向区域。编程位置有两种类型，分别是停止点（stop
point）和飞跃点（fly-by point）,如果是stop point，则表示机械臂和外部轴必须到达该
位置，并且在到达该位置前不会执行下一条指令。如果是fly-by point，则机械臂不会到达
该位置，而是在靠近该位置时开始转向，并且在机械臂到达转向区域前程序开始执行下一条
指令。转向区域越大，转向越平滑，但转向区域半径不能超过编程位置与前后位置最近距离
的1/3，如果超过该范围，机械臂会自动调整该区域大小。

转向区域根据TCP位置到编程位置的距离定义为两个区域，第一个为重新定向区域，称作
extended zone，该区域半径为pzone\_ori ，第二个为TCP路径区域，称作TCP zone，该区
域半径为pzone\_tcp。TCP zone大小要小于extended zone，意即TCP不能先于工具方向进
入角路径,如果pzone\_ori小于pzone\_tcp,则会修改pzone\_ori,使其与pzone\_tcp相等。
在TCP到达extended zone区域时开始重新定向但此时TCP继续向编程位置靠近，当TCP到
达TCP zone时TCP转入角路径。

extended zone和TCP zone的大小会受到工具方向到编程位置方向的角度的影响，定义该角
度值为zone\_ori比如从p1到p2, 如果pzone\_ori与p1和p2距离的比值大于zone\_ori与
p1和p2转角的比值，则会减小pzone\_ori的值使比值相等。TCP进入角路径的位置也会受到
zone\_ori的影响，如果pzone\_tcp与p1和p2距离的比值大于zone\_ori与p1和p2转角的
比值，则会减小pzone\_tcp的值使比值相等。该现象称为区域缩小。意即，extended zone
和TCP zone要保证工具方向转至指定的范围内才进入角路径开始转向。


下面是区域缩小的例子，路径从P1经过P2到P3，P1和P2的距离len为200mm，P1和P2的角度
agl为50°，pzone\_tcp = 60mm, pzone\_ori = 90mm，zone\_ori = 10°，

pzone\_tcp/len = 30\%

pzone\_ori/len = 45\%

zone\_ori/agl = 20\% 

则会调整pzone\_tcp 和pzone\_ori 的值，使比值都为20\%. 

\subsection*{数据项}

\subsubsection*{finep}
类型：bool

用于表示编程位置是停止点(fine point)还是飞跃点(fly-by point)

true表示是fine point，程序在机械臂到达停止点之前不会继续执行。

false表示是fly-by point，程序在机械臂到达zone之前会继续执行100ms。

如果让机械臂到达某个位置执行夹取或其他动作，一般将该位置设置为fine point。

\subsubsection*{pzone\_tcp}
类型：num

用于表示TCP zone半径，单位为mm。

\subsubsection*{pzone\_ori}
类型：num

用于表示extern zone的半径，单位为mm。该值应小于编程位置与前后位置最近距离的1/3，
大于pzone\_tcp, 若该值过小则将其自动设置为与pzone\_tcp 相等。

\subsubsection*{pzone\_eax}
类型：num

带外部轴的extern zone半径，单位为mm。该值应小于编程位置与前后位置最近距离的1/3，
大于pzone\_tcp, 若该值过小则将其自动设置为与pzone\_tcp相等。

\subsubsection*{zone\_ori}
类型：num

用于表示重定向区域的大小，单位为degrees。如果机械臂夹持着工件，则该值表示工件
旋转的角度。

\subsubsection*{zone\_leax}
类型：num

带线性外轴的重定向区域大小，单位为mm。

\subsubsection*{zone\_reax}
类型：num

带旋转外轴的重定向区域大小，单位为degrees 。

\begin{table}[htbp]
	\centering
	\scalebox{0.9}{
		\begin{tabular}{| l | l | l | l | l | l | l |}
			\hline
			\multicolumn{4}{|l|}{Path zone} & \multicolumn{3}{l|}{Zone} \\
			\hline
			Name & pzone\_tcp(mm) & pzone\_ori(mm) & pzone\_eax(mm) & zone\_ori(°) & zone\_leax(mm) & zone\_reax(°) \\
			\hline
			fine & 0 & 0 & 0 & 0 & 0 & 0\\
			\hline
			z0 & 0.3 & 0.3 & 0.3 & 0.03 & 0.3 & 0.03\\
			\hline
			z1 & 1 & 1 & 1 & 0.1 & 1 & 0.1\\
			\hline
			z5 & 5 & 8 & 8 & 0.8 & 8 & 0.8\\
			\hline
			z10 & 10 & 15 & 15 & 1.5 & 15 & 1.5\\
			\hline
			z15 & 15 & 23 & 23 & 2.3 & 23 & 2.3\\
			\hline
			z20 & 20 & 30 & 30 & 3.0 & 30 & 3.0\\
			\hline
			z30 & 30 & 45 & 45 & 4.5 & 45 & 4.5\\
			\hline
			z40 & 40 & 60 & 60 & 6.0 & 60 & 6.0\\
			\hline
			z50 & 50 & 75 & 75 & 7.5 & 75 & 7.5\\
			\hline
			z60 & 60 & 90 & 90 & 9.0 & 90 & 9.0\\
			\hline
			z80 & 80 & 120 & 120 & 12 & 120 & 12\\
			\hline
			z100 & 100 & 150 & 150 & 15 & 150 & 15\\
			\hline
			z150 & 150 & 225 & 225 & 23 & 225 & 23\\
			\hline
			z200 & 200 & 300 & 300 & 30 & 300 & 30\\
			\hline
		\end{tabular}
	}
\end{table}

\end{document}
